package fiuba.algo3.caso;

import fiuba.algo3.ObjetoRobado.ObjetoValorBajo;
import fiuba.algo3.ObjetoRobado.ObjetoRobado;
import fiuba.algo3.ObjetoRobado.ObjetoValorMedio;
import fiuba.algo3.ObjetoRobado.ObjetoValorAlto;
import fiuba.algo3.Perfil;
import fiuba.algo3.ObjetoRobado.ConsultorObjetoRobado;
import fiuba.algo3.SistemaInterpol;
import fiuba.algo3.Sospechoso;
import fiuba.algo3.Sospechoso;
import fiuba.algo3.mundo.Mundo;
import fiuba.algo3.mundo.Pais;

public class Caso
{	
	private final Sospechoso culpable;
	private final ObjetoRobado objetoRobado;
	private final RutaDeEscape ruta;

	public Caso(Mundo mundo, int cantidadArrestos)
	{
		culpable = obtenerSospechosoAleatorio();
		ruta = inicializarRutaDeEscape(mundo);
		objetoRobado = setearObjetoRobado(cantidadArrestos, this.ruta.obtenerPaisInicial());
		this.ajustarLongitudRuta(objetoRobado);
		ruta.asignarLugares(culpable);
	}

	public ObjetoRobado obtenerObjetoRobado(){
		return this.objetoRobado;
	}

	public Sospechoso obtenerCulpable()
	{	
		return culpable;
	}

	public boolean coincideIdentidadConSospechoso(Perfil perfilOrden)
	{
		return this.culpable.coincideExactamentePerfil(perfilOrden);
	}

	public int obtenerLongitudRutaEscape()
	{
		return this.ruta.obtenerLargoRuta();
	}

	public void ajustarLongitudRuta(ObjetoValorBajo o)
	{
		int largoRuta = 4;
		
		ruta.ajustarLongitud(largoRuta);
	}

	public void ajustarLongitudRuta(ObjetoValorMedio o)
	{
		int largoRuta = 5;
		
		ruta.ajustarLongitud(largoRuta);
	}
	
	public void ajustarLongitudRuta(ObjetoValorAlto o)
	{
		int largoRuta = 7;
		
		ruta.ajustarLongitud(largoRuta);		
	}
	
	public boolean sospechosoEstaEnPais(Pais pais)
	{		
		return ruta.obtenerUltimoPais().esElMismoQue(pais);
	}

	private Sospechoso obtenerSospechosoAleatorio()
	{
		return SistemaInterpol.obtenerSospechosoAleatorio();
	}

	private void ajustarLongitudRuta(ObjetoRobado objetoRobado)
	{
		objetoRobado.ajustarLongitudRuta(this);
	}

	private RutaDeEscape inicializarRutaDeEscape(Mundo mundo)
	{
		return new RutaDeEscape(mundo);
	}

	private ObjetoRobado setearObjetoRobado(int cantidadArrestos, Pais pais)
	{
		if (cantidadArrestos <= 5)
			return ConsultorObjetoRobado.obtenerObjetoRobado(pais, "Bajo");

		if (cantidadArrestos <= 12)
			return ConsultorObjetoRobado.obtenerObjetoRobado(pais, "Medio");

		return ConsultorObjetoRobado.obtenerObjetoRobado(pais, "Alto");
	}

	public String obtenerNombrePaisInicial()
	{
		
		return ruta.obtenerPaisInicial().obtenerNombre();
	}

	public RutaDeEscape obtenerRutaDeEscape()
	{
		return this.ruta;
	}

	public Pais obtenerPaisInicial()
	{
		return this.ruta.obtenerPaisInicial();
	}
}